home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / network / ka9q / ka9q_src.arc / IPCMD.C < prev    next >
C/C++ Source or Header  |  1988-07-28  |  5KB  |  241 lines

  1. /* IP-related user commands */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "internet.h"
  6. #include "timer.h"
  7. #include "netuser.h"
  8. #include "iface.h"
  9. #include "ip.h"
  10. #include "cmdparse.h"
  11.  
  12. int doipaddr(),doipstat(),dottl();
  13. extern char badhost[];
  14. struct cmds ipcmds[] = {
  15.     "address",    doipaddr,    0,    NULLCHAR,    NULLCHAR,
  16.     "status",    doipstat,    0,    NULLCHAR,    NULLCHAR,
  17.     "ttl",        dottl,        0,    NULLCHAR,    NULLCHAR,
  18.     NULLCHAR,    NULLFP,        0,
  19.         "ip subcommands: address status ttl",    NULLCHAR,
  20. };
  21. doip(argc,argv)
  22. int argc;
  23. char *argv[];
  24. {
  25.     return subcmd(ipcmds,argc,argv);
  26. }
  27. int
  28. doipaddr(argc,argv)
  29. int argc;
  30. char *argv[];
  31. {
  32.     char *inet_ntoa();
  33.     int32 n;
  34.  
  35.     if(argc < 2) {
  36.         printf("%s\n",inet_ntoa(ip_addr));
  37.     } else if((n = resolve(argv[1])) == 0){
  38.         printf(badhost,argv[1]);
  39.         return 1;
  40.     } else
  41.         ip_addr = n;
  42.     return 0;
  43. }
  44. int
  45. dottl(argc,argv)
  46. char *argv[];
  47. {
  48.     if(argc < 2)
  49.         printf("%u\n",ip_ttl & 0xff);
  50.     else
  51.         ip_ttl = atoi(argv[1]);
  52.     return 0;
  53. }
  54.  
  55. /* "route" subcommands */
  56. int doadd(),dodrop();
  57. static struct cmds rtcmds[] = {
  58.     "add", doadd, 3,
  59.     "route add <dest addr>[/<bits>] <if name> [gateway] [metric]",
  60.     "Add failed",
  61.  
  62.     "drop", dodrop, 2,
  63.     "route drop <dest addr>[/<bits>]",
  64.     "Not in table",
  65.  
  66.     NULLCHAR, NULLFP, 0,
  67.     "route subcommands: add, drop",
  68.     NULLCHAR, 
  69. };
  70.  
  71. /* Display and/or manipulate routing table */
  72. int
  73. doroute(argc,argv)
  74. int argc;
  75. char *argv[];
  76. {
  77.     if(argc < 2){
  78.         dumproute();
  79.         return 0;
  80.     }
  81.     return subcmd(rtcmds,argc,argv);
  82. }
  83. /* Add an entry to the routing table
  84.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  85.  */
  86. int
  87. doadd(argc,argv)
  88. int argc;
  89. char *argv[];
  90. {
  91.     struct interface *ifp;
  92.     int32 dest,gateway;
  93.     unsigned bits;
  94.     char *bitp;
  95.     int metric;
  96.  
  97.     if(strcmp(argv[1],"default") == 0){
  98.         dest = 0;
  99.         bits = 0;
  100.     } else {
  101.         if((dest = resolve(argv[1])) == 0){
  102.             printf(badhost,argv[1]);
  103.             return 1;
  104.         }
  105.  
  106.         /* If IP address is followed by an optional slash and
  107.          * a length field, (e.g., 128.96/16) get it;
  108.          * otherwise assume a full 32-bit address
  109.          */
  110.         if((bitp = index(argv[1],'/')) != NULLCHAR){
  111.             bitp++;
  112.             bits = atoi(bitp);
  113.         } else
  114.             bits = 32;
  115.     }
  116.     for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  117.         if(strcmp(argv[2],ifp->name) == 0)
  118.             break;
  119.     }
  120.     if(ifp == NULL){
  121.         printf("Interface \"%s\" unknown\n",argv[2]);
  122.         return 1;
  123.     }
  124.     if(argc > 3){
  125.         if((gateway = resolve(argv[3])) == 0){
  126.             printf(badhost,argv[3]);
  127.             return 1;
  128.         }
  129.     } else {
  130.         gateway = 0;
  131.     }
  132.     if(argc > 4)
  133.         metric = atoi(argv[4]);
  134.     else
  135.         metric = 0;
  136.  
  137.     rt_add(dest,bits,gateway,metric,ifp);
  138.     return 0;
  139. }
  140. /* Drop an entry from the routing table
  141.  * E.g., "drop 128.96/16
  142.  */
  143. int
  144. dodrop(argc,argv)
  145. int argc;
  146. char *argv[];
  147. {
  148.     char *bitp;
  149.     unsigned bits;
  150.     int32 n;
  151.  
  152.     if(strcmp(argv[1],"default") == 0){
  153.         n = 0;
  154.         bits = 0;
  155.     } else {
  156.         /* If IP address is followed by an optional slash and length field,
  157.          * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  158.          */
  159.         if((bitp = index(argv[1],'/')) != NULLCHAR){
  160.             bitp++;
  161.             bits = atoi(bitp);
  162.         } else
  163.             bits = 32;
  164.  
  165.         if((n = resolve(argv[1])) == 0){
  166.             printf(badhost,argv[1]);
  167.             return 1;
  168.         }
  169.     }
  170.     return rt_drop(n,bits);
  171. }
  172.  
  173. /* Dump IP routing table
  174.  * Dest              Length    Interface    Gateway          Metric
  175.  * 192.001.002.003   32        sl0          192.002.003.004       4
  176.  */
  177. int
  178. dumproute()
  179. {
  180.     register unsigned int i,bits;
  181.     register struct route *rp;
  182.  
  183.     printf("Dest              Length    Interface    Gateway          Metric\n");
  184.     if(r_default.interface != NULLIF){
  185.         printf("default           0         %-13s",
  186.          r_default.interface->name);
  187.         if(r_default.gateway != 0)
  188.             printf("%-17s",inet_ntoa(r_default.gateway));
  189.         else
  190.             printf("%-17s","");
  191.         printf("%6u\n",r_default.metric);
  192.     }
  193.     for(bits=1;bits<=32;bits++){
  194.         for(i=0;i<NROUTE;i++){
  195.             for(rp = routes[bits-1][i];rp != NULLROUTE;rp = rp->next){
  196.                 printf("%-18s",inet_ntoa(rp->target));
  197.                 printf("%-10u",bits);
  198.                 printf("%-13s",rp->interface->name);
  199.                 if(rp->gateway != 0)
  200.                     printf("%-17s",inet_ntoa(rp->gateway));
  201.                 else
  202.                     printf("%-17s","");
  203.                 printf("%6u\n",rp->metric);
  204.             }
  205.         }
  206.     }
  207.     return 0;
  208. }
  209.  
  210. int
  211. doipstat(argc,argv)
  212. int argc;
  213. char *argv[];
  214. {
  215.     extern struct ip_stats ip_stats;
  216.     extern struct reasm *reasmq;
  217.     register struct reasm *rp;
  218.     register struct frag *fp;
  219.     char *inet_ntoa();
  220.  
  221.     printf("IP: total %ld runt %u len err %u vers err %u",
  222.         ip_stats.total,ip_stats.runt,ip_stats.length,ip_stats.version);
  223.     printf(" chksum err %u badproto %u\n",
  224.         ip_stats.checksum,ip_stats.badproto);
  225.  
  226.     if(reasmq != NULLREASM)
  227.         printf("Reassembly fragments:\n");
  228.     for(rp = reasmq;rp != NULLREASM;rp = rp->next){
  229.         printf("src %s",inet_ntoa(rp->source));
  230.         printf(" dest %s",inet_ntoa(rp->dest));
  231.         printf(" id %u pctl %u time %u len %u\n",
  232.             rp->id,rp->protocol,rp->timer.count,rp->length);
  233.         for(fp = rp->fraglist;fp != NULLFRAG;fp = fp->next){
  234.             printf(" offset %u last %u\n",fp->offset,fp->last);
  235.         }
  236.     }
  237.     doicmpstat();
  238.     return 0;
  239. }
  240.  
  241.